package com.python.pydev.analysis.system_info_builder;
/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import junit.framework.TestCase;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceStore;
import org.python.pydev.core.FileUtilsFileBuffer;
import org.python.pydev.core.IInterpreterInfo;
import org.python.pydev.core.ISystemModulesManager;
import org.python.pydev.core.MisconfigurationException;
import org.python.pydev.core.TestDependent;
import org.python.pydev.editor.codecompletion.revisited.ProjectModulesManager;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.plugin.PydevTestUtils;
import org.python.pydev.ui.interpreters.PythonInterpreterManager;
import org.python.pydev.ui.pythonpathconf.InterpreterInfo;
import com.aptana.shared_core.callbacks.ICallback;
import com.aptana.shared_core.io.FileUtils;
import com.aptana.shared_core.string.FastStringBuffer;
import com.python.pydev.analysis.additionalinfo.AbstractAdditionalDependencyInfo;
import com.python.pydev.analysis.additionalinfo.AdditionalSystemInterpreterInfo;
import com.python.pydev.analysis.additionalinfo.IInfo;
/**
* @author fabioz
*
*/
public class InterpreterInfoBuilderTest extends TestCase {
private File baseDir;
private File libDir;
@Override
protected void setUp() throws Exception {
baseDir = new File(FileUtils.getFileAbsolutePath(new File("InterpreterInfoBuilderTest.temporary_dir")));
try {
FileUtils.deleteDirectoryTree(baseDir);
} catch (Exception e) {
//ignore
}
libDir = new File(baseDir, "Lib");
libDir.mkdirs();
FileUtils.writeStrToFile("class Module1:pass", new File(libDir, "module1.py"));
FileUtils.writeStrToFile("class Module2:pass", new File(libDir, "module2.py"));
FileUtils.writeStrToFile("class Module3:pass", new File(libDir, "module3.py"));
PydevTestUtils.setTestPlatformStateLocation();
FileUtilsFileBuffer.IN_TESTS = true;
ProjectModulesManager.IN_TESTS = true;
}
@Override
protected void tearDown() throws Exception {
FileUtils.deleteDirectoryTree(baseDir);
ProjectModulesManager.IN_TESTS = false;
FileUtilsFileBuffer.IN_TESTS = false;
}
public void testInterpreterInfoBuilder() throws Exception {
Collection<String> pythonpath = new ArrayList<String>();
pythonpath.add(libDir.toString());
final InterpreterInfo info = new InterpreterInfo("2.6", TestDependent.PYTHON_EXE, pythonpath);
IPreferenceStore preferences = new PreferenceStore();
final PythonInterpreterManager manager = new PythonInterpreterManager(preferences);
PydevPlugin.setPythonInterpreterManager(manager);
manager.setInfos(new IInterpreterInfo[] { info }, new HashSet<String>(), null);
final AdditionalSystemInterpreterInfo additionalInfo = new AdditionalSystemInterpreterInfo(manager,
info.getExecutableOrJar());
AdditionalSystemInterpreterInfo.setAdditionalSystemInfo(manager, info.getExecutableOrJar(), additionalInfo);
//Don't load it (otherwise it'll get the 'proper' info).
//AdditionalSystemInterpreterInfo.loadAdditionalSystemInfo(manager, info.getExecutableOrJar());
final ISystemModulesManager modulesManager = info.getModulesManager();
assertEquals(0, modulesManager.getSize(false));
assertEquals(0, additionalInfo.getAllTokens().size());
InterpreterInfoBuilder builder = new InterpreterInfoBuilder();
builder.setInfo(info, 0);
waitUntilCondition(new ICallback<String, Object>() {
public String call(Object arg) {
int size = modulesManager.getSize(false);
if (size == 3) {
return null;
}
return "Expected size = 3, found: " + size;
}
});
waitUntilCondition(new ICallback<String, Object>() {
public String call(Object arg) {
try {
AbstractAdditionalDependencyInfo additionalSystemInfo = AdditionalSystemInterpreterInfo
.getAdditionalSystemInfo(manager, manager.getInterpreterInfos()[0].getExecutableOrJar(),
true);
if (additionalInfo != additionalSystemInfo) {
throw new RuntimeException("Expecting it to be the same instance.");
}
} catch (MisconfigurationException e) {
throw new RuntimeException(e);
}
Collection<IInfo> allTokens = additionalInfo.getAllTokens();
int size = allTokens.size();
if (size == 3) {
return null;
}
FastStringBuffer buf = new FastStringBuffer();
for (IInfo i : allTokens) {
buf.append(i.toString());
}
return "Expected size = 3, found: " + size + "\nTokens: " + buf;
}
});
}
private void waitUntilCondition(ICallback<String, Object> call) {
long currentTimeMillis = System.currentTimeMillis();
String msg = null;
while (System.currentTimeMillis() < currentTimeMillis + 5000) { //at most 5 seconds
msg = call.call(null);
if (msg == null) {
return;
}
synchronized (this) {
try {
wait(25);
} catch (Exception e) {
e.printStackTrace();
}
}
}
fail("Condition not satisfied in 5 seconds." + msg);
}
}